---
title: '数据库'
date: '2023-03-19 22:10:43 ' 
images: ['https://kodo.huixiangwuyou.com/blog/images/sqlinfo.png']
summary: '数据库是用于存储、管理和检索数据的系统。根据数据模型、存储方式和应用场景的不同，数据库可以分为多种类型: 关系型数据库（RDBMS）、 非关系型数据库（NoSQL）、 内存数据库、 时序数据库、 搜索引擎数据库、 对象数据库、 分布式数据库、 云数据库、 NewSQL数据库、 多模型数据库'
tags:
 - SQLDB
---


### 关系型数据库

关系型数据库是最常见的数据库类型之一。它使用表格来存储数据，每个表格由行和列组成。行表示数据记录，列表示数据字段。关系型数据库使用SQL（结构化查询语言）来查询和操作数据。

- 特点：使用表格（表）来存储数据，表之间通过关系（外键）连接。支持SQL（结构化查询语言）进行数据操作。
- 优点：数据结构化，支持复杂的查询和事务处理，数据一致性高。
- 缺点：数据冗余，查询性能较低，扩展性有限，处理非结构化数据能力较弱。
- 应用：企业级应用、金融、电商等。
- 常见数据库：
  - [MySQL](/2023/05/04/db/mysql/)：开源，广泛用于Web应用。
  - [Oracle](/2023/08/27/db/oracle/)：企业级数据库，功能丰富，性能强大。
  - SQL Server：微软开发，适用于Windows环境。
  - PostgreSQL：功能强大，支持复杂查询和扩展。
  - SQLite：轻量级，嵌入式数据库，适合移动应用和小型项目。


### 非关系型数据库  
非关系型数据库（NoSQL）是一种新型的数据库系统，与传统的关系型数据库相比，它具有更高的可扩展性、灵活性和性能。非关系型数据库采用了不同的数据模型，如键值存储、文档存储、列存储等，以满足不同应用场景的需求。

- 特点：不使用表格存储数据，数据模型灵活，适合处理非结构化或半结构化数据。
   - 即是可以在存储的时候有键值对没有，或者多出来的键值对也可以存储。
- 优点：高性能、可扩展性强，适用于大规模数据存储和处理。
- 缺点：数据模型灵活，查询和操作复杂，不支持复杂的查询和事务处理，数据一致性较低。
- 应用：社交网络、物联网、实时分析等。
- 常见数据库：
  - 文档型数据库：存储文档（如JSON、XML），适合内容管理系统和实时分析。
    - [MongoDB](/2023/06/17/db/mongodb/)：最流行的文档型数据库，支持丰富的查询和索引。
    - CouchDB：分布式文档数据库，支持离线同步。
  - 键值型数据库：通过键值对存储数据，适合缓存和简单查询。
    - [Redis](/2023/06/20/db/redis)：高性能键值存储数据库，支持多种数据结构。  
    - Memcached：高性能缓存数据库，用于存储临时数据，AWS提供的托管键值数据库，扩展性好。
  - 列族数据库：按列存储数据，适合大数据分析和分布式存储。
    - Cassandra：分布式列族数据库，支持高可用性、大规模数据和水平扩展。 
    - HBase：分布式列族数据库，支持实时查询和高性能写入。基于Hadoop的列族数据库，适合大数据处理。 
  - 图形型数据库：存储图形数据，适合社交网络和推荐系统。
    - Neo4j：高性能图形数据库，支持复杂查询和事务处理。
    - InfiniDB：高性能图形数据库，支持复杂查询和事务处理。  


### 内存数据库

内存数据库是一种将数据存储在内存中的数据库系统。与传统的磁盘数据库相比，内存数据库具有更高的读写速度和更低的延迟。内存数据库通常用于缓存、会话管理和实时数据处理等场景。

- 特点：将数据存储在内存中，读写速度快，适用于缓存、会话管理和实时数据处理。  
- 优点：读写速度快，适用于缓存、会话管理和实时数据处理。
- 缺点：数据易丢失（断电后数据丢失），成本较高，不适用于持久化存储。
- 应用：缓存、会话管理、实时数据处理等。
- 常见数据库：
  - [Redis](/2023/05/04/db/redis)：高性能键值存储数据库，支持多种数据结构。  
  - Memcached：高性能缓存数据库，用于存储临时数据，AWS提供的托管键值数据库，扩展性好。
  - SAP HANA：内存数据库，支持实时分析和事务处理。


### 时序数据库

时序数据库是一种专门用于存储和处理时间序列数据的数据库系统。时序数据库通常用于存储和分析传感器数据、物联网数据、金融数据等时间序列数据。

- 特点：将时间序列数据存储在数据库中（如传感器数据、日志数据），支持高效的时间序列查询和分析。
- 优点：针对时间序列数据优化，写入和查询性能高。
- 缺点：数据量较大，存储成本较高,不适合非时间序列数据的存储和查询。
- 应用：物联网、金融、医疗等领域。
- 常见数据库：
  - InfluxDB：开源时序数据库，支持高吞吐量数据写入和查询。
  - OpenTSDB：开源时序数据库，监控和报警系统，内置时序数据库。
  - Prometheus：开源时序数据库，基于PostgreSQL的时序数据库，支持SQL查询。


### 搜索引擎数据库

搜索引擎数据库是一种专门用于存储和检索搜索引擎数据的数据库系统。搜索引擎数据库通常用于存储和检索搜索引擎数据，如网页、文档、图像等。

- 特点：将搜索引擎数据存储在数据库中，支持高效和复杂的查询和分词的搜索和检索。
- 优点：搜索性能高，针对搜索引擎数据优化，支持复杂的查询和分词的搜索和检索。
- 缺点：不适合事务处理和复杂的数据关系，数据量较大，存储成本较高。
- 应用：搜索引擎、内容管理系统、电子商务等领域。
- 常见数据库：
  - Elasticsearch：分布式搜索引擎，支持实时搜索和分析，支持高吞吐量数据写入和查询。
  - Solr：基于Lucene的搜索引擎，支持复杂的查询和分析，支持高吞吐量数据写入和查询。


### 对象数据库

对象数据库是一种将数据存储为对象的数据库系统。对象数据库通常用于存储和检索对象数据，如Java对象、Python对象等。

- 特点：直接存储对象（如面向对象编程中的对象），适合复杂数据结构的存储。
- 优点：直接存储对象，与面向对象编程语言无缝集成，支持复杂数据结构的存储。
- 缺点：不适合非对象数据的存储和查询，数据模型复杂，查询性能较低，应用场景有限，生态系统较小。
- 应用：企业级应用、Web应用、移动应用等领域。
- 常见数据库：
  - CouchDB：分布式文档数据库，支持离线同步。
  - Neo4j：高性能图形数据库，支持复杂查询和事务处理。


### 分布式数据库

分布式数据库是一种将数据分布在多个节点上的数据库系统。分布式数据库通常用于处理大规模数据和高并发访问的场景。

- 特点：将数据分布在多个节点上，支持高并发访问和数据复制，提高系统的可用性和性能。
- 优点：支持高并发访问和数据复制，提高系统的可用性和性能，扩展性好，适合大规模数据和高并发场景。
- 缺点：数据一致性和一致性要求较高，数据同步和复制的开销较大，系统复杂，数据一致性和事务处理较难保证。
- 应用：电子商务、社交网络、金融等领域。
- 常见数据库：
  - CockroachDB：分布式关系型数据库，支持SQL和强一致性。
  - Cassandra：分布式列族数据库，支持高并发访问和数据复制。
  - TiDB：分布式关系型数据库，兼容MySQL协议。

### 云数据库

云数据库是一种将数据库服务托管在云平台上的数据库系统。云数据库通常提供了更便捷的数据库管理和部署方式，用户可以通过云平台的管理界面来创建、管理和维护数据库。

- 特点：将数据库服务托管在云平台上，用户可以通过云平台的管理界面来创建、管理和维护数据库，提供自动扩展、备份和监控功能。  
- 优点：提供更便捷的数据库管理和部署方式，易于管理，扩展性好，适合云原生应用。
- 缺点：与本地数据库相比，性能和可用性可能受到云平台的限制，数据安全性和隐私性需要用户自行管理。
- 应用：企业级应用、Web应用、移动应用等领域。
- 常见数据库：
  - Amazon RDS：Amazon提供的关系型数据库服务，支持多种数据库引擎，如MySQL、PostgreSQL、Oracle等。
  - Microsoft Azure SQL Database：Microsoft提供的关系型数据库服务，支持多种数据库引擎，如SQL Server、MySQL、PostgreSQL等。
  - Google Cloud SQL：Google提供的关系型数据库服务，支持多种数据库引擎，如MySQL、PostgreSQL、SQL Server等。
  - 阿里云数据库服务：阿里云提供的关系型数据库服务，支持多种数据库引擎，如MySQL、PostgreSQL、SQL Server等。


### NewSQL数据库

NewSQL数据库是一种基于SQL的数据库系统，旨在提供高性能、可扩展性和一致性的数据库服务。NewSQL数据库通常采用了新的数据库架构和技术，以满足现代应用程序的需求。
- 特点：基于SQL的数据库系统，结合了关系型数据库的ACID特性和NoSQL的扩展性，采用了新的数据库架构和技术，以提供高性能、可扩展性和一致性的数据库服务。
- 优点：高性能、可扩展性和一致性，支持分布式事务和高并发。
- 缺点：系统复杂，生态系统较小,与传统的SQL数据库相比，学习曲线较陡，不适合传统的SQL应用程序。
- 应用：企业级应用、金融、物联网等领域。
- 常见数据库：
  - CockroachDB：分布式关系型数据库，支持SQL和强一致性。
  - TiDB：分布式关系型数据库，兼容MySQL协议。
  - Vitess：分布式SQL数据库，支持水平扩展和自动分片。
  - Spanner：全球分布式数据库，支持强一致性和高可用性。

### 多模型数据库

多模型数据库是一种将不同类型的数据存储在同一个数据库中的数据库系统。多模型数据库通常采用了多种数据模型，以满足不同应用场景的需求。
- 特点：将不同类型的数据存储在同一个数据库中的数据库系统，采用了多种数据模型（如文档、图、键值等，以满足不同应用场景的需求。
- 优点：支持多种数据模型，适合多种数据类型的存储和查询,灵活度高，易于扩展。  
- 缺点：数据模型复杂，查询和操作复杂，不适合非结构化数据的存储和查询,性能可能不如单一模型的数据库。
- 应用：企业级应用、Web应用、移动应用等领域。
- 常见数据库：
  - ArangoDB：支持文档、图和键值存储的多模型数据库。
  - CouchDB：分布式文档数据库，支持离线同步。
  - Couchbase：支持文档和键值存储的多模型数据库。

<br/>
当前国内用的比较多的还是MONGODB、ORACLE和MYSQL，和内存数据库REDIS,其他的数据库用的比较少，也没有深入研究过。  

### MONGODB、MYSQL、ORACLE和REDIS对比

#### 数据结构
| 数据库 | 数据结构 | 
| --- | --- | 
| MongoDB | - 文档（BSON）<br/>- 支持嵌套文档和数组 |
| MySQL | - 表格（行和列）<br/>- 支持关系模型和外键 |  
| Redis | - 字符串、列表、集合、哈希、有序集合等| 
| Oracle | - 表格（行和列）<br/>-  支持关系模型、对象类型和 XML 数据 | 
|  |  | 

#### 数据模型
| 数据库 | 数据模型 | 特点 |
| --- | --- | --- | 
| MongoDB | 文档型数据库 | 数据以 BSON（类似 JSON）格式存储，支持嵌套文档和动态字段，适合半结构化数据。 | 
| MySQL | 关系型数据库 | 数据以表格形式存储，支持严格的表结构和外键约束，适合结构化数据。 | 
| Redis | 键值型数据库 | 数据以键值对形式存储，值可以是字符串、列表、集合、哈希等，适合简单数据模型。 | 
| Oracle | 关系型数据库 | 数据以表格形式存储，支持复杂的关系模型和事务处理，适合企业级应用。 |    
|  |  | 

#### 性能
| 数据库 | 性能特点 | 
| --- | --- | 
| MongoDB | - 读写性能高，适合高并发场景<br/>- 支持索引和聚合操作，查询性能较好 |
| MySQL | - 读写性能较好，适合中小规模数据<br/>- 支持索引和查询优化，复杂查询性能较优 |  
| Redis | - 读写性能极高（基于内存） <br/>- 适合高吞吐量和低延迟场景 | 
| Oracle | - 读写性能优异，支持大规模数据处理<br/>-  支持并行查询和复杂事务处理 | 
|  |  | 


#### 扩展性
| 数据库 | 扩展性 | 
| --- | --- | 
| MongoDB | - 水平扩展性好，支持分片（Sharding）<br/>- 适合大规模分布式系统 |
| MySQL | - 垂直扩展性好，水平扩展较复杂<br/>- 需要分库分表或使用中间件（如 MyCat） |  
| Redis | - 水平扩展性好，支持 Redis Cluster <br/>- 适合分布式缓存和消息队列 | 
| Oracle | - 垂直扩展性好，支持 RAC（Real Application Clusters）<br/>-  适合大规模企业级系统 | 
|  |  | 

#### 高可用性与容灾
| 数据库 | 扩展性 | 
| --- | --- | 
| MongoDB | - 支持副本集（Replica Set）和分片<br/>- 自动故障转移 |
| MySQL | - 支持主从复制和集群（如 InnoDB Cluster）<br/>- 需要手动配置故障转移 |  
| Redis | - 支持主从复制和哨兵模式（Sentinel） <br/>- 自动故障转移 | 
| Oracle | - 支持 RAC、Data Guard 和 GoldenGate<br/>-  强大的容灾和备份恢复功能 | 
|  |  | 

#### 事务支持
| 数据库 | 扩展性 | 
| --- | --- | 
| MongoDB | - 支持多文档事务（4.0 版本以后）<br/>- 事务性能较弱，适合非强一致性场景 |
| MySQL | - 支持 ACID 事务<br/>- 适合需要强一致性的场景 |  
| Redis | - 支持简单事务（MULTI/EXEC） <br/>- 不支持完整的 ACID 事务 | 
| Oracle | - 支持完整的 ACID 事务<br/>-  适合复杂事务处理和高一致性场景 | 
|  |  | 


#### 适用场景
| 数据库 | 适用场景 | 
| --- | --- | 
| MongoDB | - 内容管理系统（CMS）<br/>- 实时分析 <br/>- 物联网（IoT）数据存储 <br/>-  社交网络数据存储 |
| MySQL | Web 应用（如 WordPress、Drupal）<br/>- 中小型企业应用<br/>- 需要事务支持的场景 |  
| Redis | - 缓存<br/>- 会话存储 <br/>- 实时排行榜 <br/>-  消息队列 | 
| Oracle | - 金融系统（如银行、证券）<br/>- 电信系统 <br/>- 大型企业 ERP 系统 <br/>-  政府系统  | 
|  |  | 

#### 生态系统
| 数据库 | 生态系统 | 
| --- | --- | 
| MongoDB | - 丰富的驱动程序和工具（如 MongoDB Compass） <br/>-  支持云服务（如 MongoDB Atlas） |
| MySQL | - 庞大的社区和工具支持（如 phpMyAdmin、MySQL Workbench）<br/>- 支持云服务（如 Amazon RDS）|  
| Redis | -  丰富的客户端库和工具（如 Redis Desktop Manager） <br/>-  支持云服务（如 Redis Labs） | 
| Oracle | - 强大的企业级工具（如 Oracle Enterprise Manager） <br/>-  支持云服务（如 Oracle Cloud）  | 
|  |  | 


#### 成本
| 数据库 | 成本 | 
| --- | --- | 
| MongoDB | - 社区版免费，企业版收费<br/>- 适合中小型企业和开发者 |
| MySQL | - 社区版免费，企业版收费<br/>- 适合中小型项目 |  
| Redis | - 开源免费 <br/>- 适合缓存和简单数据存储 | 
| Oracle | - 商业软件，成本较高<br/>-  适合大型企业和关键业务系统 | 
|  |  | 


#### 总结对比

| 特性 | MongoDB | MySQL | 	Redis | Oracle | 
| --- | --- | --- | --- | --- | 
| 数据模型 | 文档型 | 关系型 | 键值型 | 关系型 |
| 适用场景 | 半结构化数据、实时分析 | 结构化数据、Web 应用 | 缓存、消息队列 | 企业级应用、金融系统 | 
| 性能 | 高并发读写 | 中等规模数据处理 | 极高读写性能 | 大规模数据处理 |
| 扩展性 | 水平扩展性好 | 垂直扩展性好 | 水平扩展性好 | 垂直和水平扩展性好 | 
| 事务支持 | 多文档事务 | ACID 事务 | 简单事务 | 完整 ACID 事务 |
| 数据结构 | 文档、嵌套文档 | 表格、关系模型 | 字符串、列表、集合等 | 表格、对象类型 | 
| 高可用性 | 副本集、分片 | 主从复制、集群 | 主从复制、哨兵模式 | RAC、Data Guard |
| 成本 | 社区版免费 | 社区版免费 | 开源免费 | 商业软件，成本高 | 
| 生态系统 | 丰富的工具和云服务 | 庞大的社区和工具支持 | 丰富的客户端库 | 强大的企业级工具 |
|  |  |  |  |  |

#### 选择建议
- 选择 MongoDB：如果需要处理半结构化数据、高并发读写或实时分析。
- 选择 MySQL：如果需要处理结构化数据、事务支持和复杂查询，需要一个成熟的关系型数据库，适合 Web 应用或中小型项目。
- 选择 Redis：如果需要高性能缓存、会话存储或消息队列。
- 选择 Oracle：如果需要企业级功能、复杂事务处理或大规模数据管理。